package storage

import (
	"fmt"
	"mime/multipart"

	"fitness/go-admin/internal/model"

	"gorm.io/gorm"
)

// DatabaseStorage MySQL BLOB存储
type DatabaseStorage struct {
	config *StorageConfig
	db     *gorm.DB
}

// NewDatabaseStorage 创建数据库存储实例
func NewDatabaseStorage(config *StorageConfig, db interface{}) *DatabaseStorage {
	gormDB, ok := db.(*gorm.DB)
	if !ok {
		panic("数据库连接类型错误")
	}
	return &DatabaseStorage{
		config: config,
		db:     gormDB,
	}
}

// SaveFile 保存文件到数据库
func (s *DatabaseStorage) SaveFile(file multipart.File, fileName string, fileType model.FileType) (string, []byte, error) {
	// 读取文件内容
	fileData, err := ReadFileToBytes(file)
	if err != nil {
		return "", nil, err
	}

	// 生成虚拟URL（用于标识）
	fileURL := fmt.Sprintf("/db-files/%s/%s", fileType, fileName)

	// 返回URL和文件字节数组（保存到FileContent字段）
	return fileURL, fileData, nil
}

// SaveThumbnail 保存缩略图到数据库
func (s *DatabaseStorage) SaveThumbnail(data []byte, fileName string) (string, []byte, error) {
	thumbnailURL := fmt.Sprintf("/db-thumbnails/thumb_%s", fileName)
	return thumbnailURL, data, nil
}

// GetFile 从数据库获取文件内容
func (s *DatabaseStorage) GetFile(fileURL string) ([]byte, error) {
	var fileRecord model.FileRecord
	err := s.db.Where("file_url = ? AND status = ?", fileURL, model.FileStatusNormal).
		Select("file_content").
		First(&fileRecord).Error
	if err != nil {
		return nil, err
	}
	return fileRecord.FileContent, nil
}

// DeleteFile 删除文件（逻辑删除，不清理BLOB）
func (s *DatabaseStorage) DeleteFile(fileURL string) error {
	// 数据库存储模式下，删除由外部Service层的软删除处理
	return nil
}

// GetStorageType 获取存储类型
func (s *DatabaseStorage) GetStorageType() model.StorageType {
	return model.StorageTypeDatabase
}
